package com.wkl.config.aspects.demo01;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class ServiceAspect {

    /**
     * 定义切点（定义了切面作用在 何处 ）
     * “注解@Pointcut”的value属性为“切点表达式”
     */
    @Pointcut(value = "execution(* com.wkl.service.UserService.getUser())")
    public void pointcut() {
    }

    /**
     * 定义通知（定义了切面 是什么 以及 何时使用 ）
     * “注解@Before”体现了“何时使用”（@Before：通知方法会在目标方法调用之前执行；value属性关联切点，支持切点表达式）
     * “方法体”体现了“是什么”，及做什么
     */
    @Before(value = "pointcut()")
    private void beforeMethod() {
        System.out.println("Aspect beforeMethod execute.");
    }

    /**
     * 同上，定义通知
     * （@Around：通知方法将目标方法包裹起来）
     */
    @Around(value = "pointcut()")
    private void aroundMethod(ProceedingJoinPoint joinPoint) {
        try {
            System.out.println("Aspect aroundMethod before target method execute.");
            //目标方法执行
            joinPoint.proceed();
            System.out.println("Aspect aroundMethod after target method execute.");
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    /**
     * 同上
     * （@After：通知方法会在目标方法返回或异常后执行）
     */
    @After(value = "pointcut()")
    private void afterMethod(JoinPoint joinPoint){
        joinPoint.getArgs();
        System.out.println("Aspect afterMethod execute.");
    }

    //同上
    @AfterReturning(value = "pointcut()")
    private void afterReturningMethod(){
        System.out.println("Aspect afterReturningMethod execute.");
    }

    //同上
    @AfterThrowing(value = "pointcut()")
    private void afterThrowingMethod(){
        System.out.println("Aspect afterThrowingMethod execute.");
    }


}


